package cn.lzj.service.User.impl.cart;

import cn.lzj.mapper.CartItemMapper;
import cn.lzj.mapper.OrderMapper;
import cn.lzj.mapper.ProductMapper;
import cn.lzj.pojo.*;
import cn.lzj.service.User.CartService;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class CartServiceImpl implements CartService {

    @Resource
    private CartItemMapper cartItemMapper;

    @Resource
    private OrderMapper orderMapper;

//    @Transactional
    @Override
    public boolean addProductToCart(CartItem cartItem, Cart cart) {
        boolean flag = false;
        Integer proId = cartItem.getProduct().getProductId();
        User user = cartItem.getUser();
        //1.如果当前用户的购物车中已经存在这个商品了，那么将购物车中的这个商品数量+1
        if(cart != null){
            Map<Integer, CartItem> cartItemMap = cart.getCartItemMap();
            if(cartItemMap == null){
                cartItemMap = new HashMap<>();
            }
            if(cartItemMap.containsKey(proId)){
                int count = cartItemMap.get(proId).getCartItemNum() + 1;
                double price = cartItemMap.get(proId).getProduct().getProductPrice()*count;
                cartItemMap.get(proId).setCartItemPrice(price);

                cartItemMap.get(proId).setCartItemNum(count);
                updateCartItem(cartItemMap.get(proId));////
                flag = true;
            }else {
                //2.否则在我的购车中新增一个这个商品的CartItem，数量为1
                addCartItem(cartItem);
                cartItemMap.put(proId,cartItem);
                user.getCart().setCartItemMap(cartItemMap);
                flag = true;
            }
        }else {
            cart = new Cart();
            cart.setCartItemMap(new HashMap<>());
            cart.getCartItemMap().put(proId,cartItem);
            addCartItem(cartItem);
            user.setCart(cart);
            flag = true;
        }
        return flag;
    }

//    @Transactional
    @Override
    public boolean addCartItem(CartItem cartItem) {
        int count = cartItemMapper.addCartItem(cartItem);
        if (count == 1){
            return true;
        }
        return false;
    }

//    @Transactional
    @Override
    public boolean updateCartItem(CartItem cartItem) {
        int count = cartItemMapper.updateCarItem(cartItem);
        if (count == 1){
            return true;
        }
        return false;
    }



//    @Transactional
    @Override
    public Cart getCart(User user) {
        List<CartItem> cartItemList = cartItemMapper.getProductItem(user);
        Cart cart = new Cart();
        Map<Integer,CartItem> map = new HashMap<>();
        for (CartItem cartItem:cartItemList){
            map.put(cartItem.getProduct().getProductId(),cartItem);
        }
        cart.setCartItemMap(map);
        return cart;
    }


    @Override
    public List<CartItem> getCartItemList(User user) {




        return null;
    }

    @Transactional
    @Override
    public Cart delCartItem(CartItem cartItem,Cart cart) {
        //1、删除数据库的cartItem记录
        cartItemMapper.delCartItemById(cartItem);
        //2、删除购物车对应的记录
        Map<Integer, CartItem> cartItemMap = cart.getCartItemMap();
        cartItemMap.remove(cartItem.getProduct().getProductId());
        return cart;
    }

    @Transactional
    @Override
    public CartItem getCartItemById(Integer cartItemId) {
        return cartItemMapper.getCartItemById(cartItemId);
    }

    @Transactional
    @Override
    public void addPayTableBean(PayTable payTableItem) {
        //订单表中添加一条记录
        orderMapper.addItemToPayTable(payTableItem);

        //设置payId
        int payId = orderMapper.selectIdByPayNo(payTableItem.getPayNo());

        payTableItem.setPayId(payId);


        //在order表中添加购物车项记录
        User user = payTableItem.getOrderUser();
        Map<Integer, CartItem> map = user.getCart().getCartItemMap();
        for (Map.Entry<Integer, CartItem> CartItemEntry : map.entrySet()) {
            Order order = new Order();
            order.setOrderNum(CartItemEntry.getValue().getCartItemNum());
            order.setPrice(CartItemEntry.getValue().getCartItemPrice());
            order.setProductBase(CartItemEntry.getValue().getProduct());
            order.setPayTable(payTableItem);
            orderMapper.addOrderToT_order(order);
        }

        cartItemMapper.delCartItem(user);
        user.getCart().setCartItemMap(new HashMap<>());
    }

    @Transactional
    @Override
    public void editCartItem(CartItem cartItem) {

        if(cartItem.getCartItemNum() == 0){
            cartItemMapper.delCartItemById(cartItem);
        }else {
            updateCartItem(cartItem);
        }
    }

    @Transactional
    @Override
    public void clearCart(User user) {
        cartItemMapper.delCartItem(user);
    }


}
